﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using DAL.Entity;


namespace DAL.Persistencia
{
    public class SupplierDAL
    {
        private NewTierraEntities Con;

        public SupplierDAL()
        {
            Con = new NewTierraEntities();
        }

        //Método para gravar um registro na tabela Supplier
        public void Salvar(Supplier c)
        {
            try
            {               

                //Rotinas prontas para o banco de dados
                Con.AddToSuppliers(c); //insert into Supplier values...
                Con.SaveChanges(); //Executar a operação
            }
            catch
            {
                throw;
            }
        }

        //Método para Excluir o Supplier na base
        public void Excluir(Supplier c)
        {
            try
            {
                Con.DeleteObject(c); //Prepara a deleção
                Con.SaveChanges(); //Executa a transação (commit)
            }
            catch
            {
                throw;
            }
        }

        //Metodo para listar todos os Supplier cadastrados 
        public List<Supplier> ListarTodos()
        {
            try
            {
                //SQL -> select * from Suppliers
                return Con.Suppliers.ToList();
            }
            catch
            {
                throw;
            }
        }

        public List<Supplier> ListarTodos(int IdTipoSupl, int IdCid)
        {
            try
            {
                return Con.Suppliers.Where(s => s.TIPOSUPL_id == IdTipoSupl &&
                                                s.CID_id == IdCid).ToList();
            }
            catch
            {
                throw;
            }
        }

        public List<Supplier> ListarTodosTrfs(int IdCid)
        {
            try
            {
                return Con.Suppliers.Where(s => s.CID_id == IdCid &&
                                                s.TIPOSUPL_id == 3 ||
                                                s.CID_id == IdCid &&
                                                s.TIPOSUPL_id == 4 ||
                                                s.CID_id == IdCid &&
                                                s.TIPOSUPL_id == 5 ).ToList();

                //return (from spp in Con.Suppliers
                //        join mon in Con.Monta_Servico on spp.S_id equals mon.S_id
                //        join sco in Con.Servico_Completo on mon.IdMServico equals sco.IdMServico
                //        join sse in Con.S_Servicos on sco.Servicos_Id equals sse.Servicos_Id
                //        where sse.Servicos_transfer != null &&
                //              spp.CID_id == IdCid
                //        select spp).Distinct().ToList();
            }
            catch
            {
                throw;
            }
        }

        public object ListarTodos(DateTime dataIn, DateTime dataOut, int IdCidade, int IdSupplier)
        {
            try
            {

                if (IdSupplier > 0)
                {
                    return (from smt in Con.S_Mercado_Tarifa
                            join smp in Con.S_Mercado_Periodo on smt.S_merc_periodo_id equals smp.S_merc_periodo_id
                            join spl in Con.Suppliers on smp.S_id equals spl.S_id
                            join tpr in Con.Tipo_Room on smt.Tipo_room_id equals tpr.Tipo_room_id
                            join tcg in Con.Tarif_Categoria on smt.Tarif_categoria_id equals tcg.Tarif_categoria_id
                            join img in Con.S_Image on spl.S_id equals img.S_id
                            join mod in Con.Moeda on smp.Moeda_id equals mod.Moeda_id
                            join sme in Con.S_Mercado_Estacao on smp.S_mercado_estacao_id equals sme.S_mercado_estacao_id
                            where smp.S_merc_periodo_from <= (dataIn) &&
                                  smp.S_merc_periodo_to >= (dataOut) &&
                                  tpr.Tipo_room_id == 2 &&
                                  spl.CID_id == IdCidade &&
                                  spl.S_id == IdSupplier &&
                                  img.Image_capa.Equals("S")
                                  ||
                                  smp.S_merc_periodo_from <= (dataOut) &&
                                  smp.S_merc_periodo_to >= (dataIn) &&
                                  tpr.Tipo_room_id == 2 &&
                                  spl.CID_id == IdCidade &&
                                  spl.S_id == IdSupplier &&
                                  img.Image_capa.Equals("S")
                            orderby smp.S_merc_periodo_fdsFrom
                            select new
                            {
                                spl.S_id,
                                spl.S_nome,
                                spl.S_endereco,
                                spl.S_telefone,
                                tpr.Tipo_room_nome,
                                tcg.Tarif_categoria_nome,
                                tcg.Tarif_categoria_id,
                                smt.S_merc_tarif_tarifa_total,
                                smp.S_merc_periodo_from,
                                smp.S_merc_periodo_to,
                                smp.S_merc_periodo_fdsFrom,
                                smp.S_merc_periodo_fdsTo,
                                img.Image_nome,
                                mod.Moeda_sigla,
                                sme.S_mercado_estacao_nome
                            }).ToList();
                }
                else
                {
                    return (from smt in Con.S_Mercado_Tarifa
                            join smp in Con.S_Mercado_Periodo on smt.S_merc_periodo_id equals smp.S_merc_periodo_id
                            join spl in Con.Suppliers on smp.S_id equals spl.S_id
                            join tpr in Con.Tipo_Room on smt.Tipo_room_id equals tpr.Tipo_room_id
                            join tcg in Con.Tarif_Categoria on smt.Tarif_categoria_id equals tcg.Tarif_categoria_id
                            join img in Con.S_Image on spl.S_id equals img.S_id
                            join mod in Con.Moeda on smp.Moeda_id equals mod.Moeda_id
                            join sme in Con.S_Mercado_Estacao on smp.S_mercado_estacao_id equals sme.S_mercado_estacao_id
                            where smp.S_merc_periodo_from <= (dataIn) &&
                                  smp.S_merc_periodo_to >= (dataOut) &&
                                  tpr.Tipo_room_id == 2 &&
                                  spl.CID_id == IdCidade &&
                                  img.Image_capa.Equals("S")
                                  ||
                                  smp.S_merc_periodo_from <= (dataOut) &&
                                  smp.S_merc_periodo_to >= (dataIn) &&
                                  tpr.Tipo_room_id == 2 &&
                                  spl.CID_id == IdCidade &&
                                  img.Image_capa.Equals("S")
                            orderby smp.S_merc_periodo_fdsFrom
                            select new
                            {
                                spl.S_id,
                                spl.S_nome,
                                spl.S_endereco,
                                spl.S_telefone,
                                tpr.Tipo_room_nome,
                                tcg.Tarif_categoria_nome,
                                tcg.Tarif_categoria_id,
                                smt.S_merc_tarif_tarifa_total,
                                smp.S_merc_periodo_from,
                                smp.S_merc_periodo_to,
                                smp.S_merc_periodo_fdsFrom,
                                smp.S_merc_periodo_fdsTo,
                                img.Image_nome,
                                mod.Moeda_sigla,
                                sme.S_mercado_estacao_nome
                            }).ToList();
                }

            }
            catch
            {
                throw;
            }
        }

        public List<Supplier> ListarTodosReport()
        {
            try
            {
                return Con.Suppliers.Where(s => s.TIPOSUPL_id == 1).OrderBy(s => s.S_nome).ToList();

                //var query = (from spp in Con.Suppliers
                //        join smp in Con.S_Mercado_Periodo on spp.S_id equals smp.S_id
                //        join smt in Con.S_Mercado_Tarifa on smp.S_merc_periodo_id equals smt.S_merc_periodo_id
                //        join tcg in Con.Tarif_Categoria on smt.Tarif_categoria_id equals tcg.Tarif_categoria_id
                //        join stt in Con.S_Mercado_Tipo_Tarifa on smt.S_mercado_tipo_tarifa_id equals stt.S_mercado_tipo_tarifa_id
                //        join tpr in Con.Tipo_Room on smt.Tipo_room_id equals tpr.Tipo_room_id
                //        join sms in Con.S_Mercado_Tarifa_Status on smt.S_merc_tarif_status_id equals sms.S_mercado_tarifa_status_id into jlf
                //        from m in jlf.DefaultIfEmpty()
                //        select new
                //        {
                //            spp.S_nome,
                //            smp.S_merc_periodo_from,
                //            smp.S_merc_periodo_to,
                //            m.S_mercado_tarifa_status_nome,
                //            smt.S_merc_tarif_tarifa_total,
                //            tcg.Tarif_categoria_nome,
                //            stt.S_mercado_tipo_tarifa_nome,
                //            tpr.Tipo_room_nome
                //        });

                //return query.ToList();
            }
            catch 
            {                
                throw;
            }
        }

        //Método para Consultar todos os Suppliers por status
        public List<Supplier> FindAllStatus(int IdStatus)
        {
            try
            {
                //select * from TbProduto where Nome like ?
                return Con.Suppliers.Where(p => p.STATUS_id.Equals(IdStatus)).ToList();
                //Expressões LAMBDA
                /*
                 * StartsWith   -> Começa com
                 * EndsWith     -> Termina com
                 * Contains     -> Contendo
                 * Equals       -> Exatamente igual
                 */
            }
            catch
            {
                throw; //Lançar a exceção adiante...
            }
        }

        //Método para Consultar todos os Suppliers por tipo
        public List<Supplier> FindAllTipo(int IdTipo)
        {
            try
            {
                //select * from TbProduto where Nome like ?
                return Con.Suppliers.Where(p => p.TIPOSUPL_id.Equals(IdTipo)).ToList();
                //Expressões LAMBDA
                /*
                 * StartsWith   -> Começa com
                 * EndsWith     -> Termina com
                 * Contains     -> Contendo
                 * Equals       -> Exatamente igual
                 */
            }
            catch
            {
                throw; //Lançar a exceção adiante...
            }
        }

        public List<Supplier> FindAllTipo(string nome, int IdTipo)
        {
            try
            {
             
                return Con.Suppliers.Where(p => p.TIPOSUPL_id == IdTipo &&
                                                p.S_nome.Contains(nome)).OrderBy(p => p.S_nome).ToList();
             
            }
            catch
            {
                throw;
            }
        }

        public List<Supplier> FindAllTipo(string nome, int IdTipo, int IdCidade)
        {
            try
            {

                return Con.Suppliers.Where(p => p.TIPOSUPL_id == IdTipo &&
                                                p.S_nome.Contains(nome) &&
                                                p.CID_id == IdCidade).OrderBy(p => p.S_nome).ToList();

            }
            catch
            {
                throw;
            }
        }

        //Método para Consultar todos os Suppliers por tipo
        public Supplier FindAllNome(string nome)
        {
            try
            {
                //select * from TbProduto where Nome like ?
                return Con.Suppliers.Where(p => p.S_nome.Contains(nome)).SingleOrDefault();
                //Expressões LAMBDA
                /*
                 * StartsWith   -> Começa com
                 * EndsWith     -> Termina com
                 * Contains     -> Contendo
                 * Equals       -> Exatamente igual
                 */
            }
            catch
            {
                throw; //Lançar a exceção adiante...
            }
        }

        public Supplier ObterSupplierPorNome(string nome)
        {
            try
            {

                return Con.Suppliers.Where(p => p.S_nome.Equals(nome)).SingleOrDefault();
            }
            catch
            {
                throw; //Lançar a exceção adiante...
            }
        }

        public Supplier ObterSupplierPorNome(string nome, int IdCidade)
        {
            try
            {

                return Con.Suppliers.Where(p => p.S_nome.Equals(nome) && p.CID_id == IdCidade).SingleOrDefault();
            }
            catch
            {
                throw; //Lançar a exceção adiante...
            }
        }

        public List<Supplier> ListarTodos(string nome)
        {
            try
            {
                return Con.Suppliers.Where(t => t.S_nome.Contains(nome)).ToList();
            }
            catch
            {
                throw;
            }
        }

        public List<Supplier> ListarTodosMontaServ(string nome)
        {
            try
            {
                return Con.Suppliers.Where(t => t.S_nome.Equals(nome)).ToList();
            }
            catch
            {
                throw;
            }
        }

        public List<Supplier> ListarTodos(string nome, int tiposupl)
        {
            try
            {
                return Con.Suppliers.Where(t => t.S_nome.Contains(nome) && t.TIPOSUPL_id != tiposupl).ToList();
            }
            catch
            {
                throw;
            }
        }

        //Método para obter 1 Supplier pelo Id
        public Supplier ObterPorId(int IdSupplier)
        {
            try
            {
                //select * from TbCliente where IdCliente = ?
                return Con.Suppliers.Where(c => c.S_id == IdSupplier).SingleOrDefault();

                //Single -> Retorna apenas 1 Registro e dá erro para qualquer
                //          resultado diferente de 1 Registro.
            }
            catch
            {
                throw;
            }
        }

        public bool ObterPorNome(string nome)
        {
            try
            {
                return Con.Suppliers.Where(s => s.S_nome.Equals(nome)).Count() != 0;
            }
            catch
            {
                throw;
            }
        }

        //Método para atualizar os dados do Supplier
        public void Atualizar(Supplier registroNovo)
        {
            try
            {
                //Buscar na base de dados o Registro antigo
                Supplier registroAntigo = ObterPorId(registroNovo.S_id);

                //Atualizando os dados
                registroAntigo.S_nome = registroNovo.S_nome;
                registroAntigo.S_razaosocial = registroNovo.S_razaosocial;
                registroAntigo.S_cnpj = registroNovo.S_cnpj;
                registroAntigo.S_endereco = registroNovo.S_endereco;
                registroAntigo.S_teleplantao = registroNovo.S_teleplantao;
                registroAntigo.S_telefone = registroNovo.S_telefone;
                registroAntigo.S_endereco = registroNovo.S_endereco;
                registroAntigo.S_http = registroNovo.S_http;
                registroAntigo.S_email = registroNovo.S_email;
                registroAntigo.S_faturar = registroNovo.S_faturar;
                registroAntigo.S_reservas = registroNovo.S_reservas;
                registroAntigo.STATUS_id = registroNovo.STATUS_id;
                registroAntigo.TIPOSUPL_id = registroNovo.TIPOSUPL_id;
                registroAntigo.CID_id = registroNovo.CID_id;
                registroAntigo.PAIS_id = registroNovo.PAIS_id;
                registroAntigo.Categ_id = registroNovo.Categ_id;
                registroAntigo.Rede_id = registroNovo.Rede_id;
                registroAntigo.CategoriaEscrita_id = registroNovo.CategoriaEscrita_id;
                registroAntigo.Responsavel_id = registroNovo.Responsavel_id;
                registroAntigo.S_cep = registroNovo.S_cep;
                registroAntigo.S_fax = registroNovo.S_fax;
                registroAntigo.S_qtdpessoas = registroNovo.S_qtdpessoas;
                registroAntigo.S_pessoaOUapt = registroNovo.S_pessoaOUapt;
                registroAntigo.Recomended = registroNovo.Recomended;

                //Executo a transação
                Con.SaveChanges();
            }
            catch
            {
                throw;
            }
        }

        //Método para atualizar os dados do Supplier
        public void Atualizar(Int32 SupplierID, Int32 categoria)
        {
            try
            {
                //Buscar na base de dados o Registro antigo
                Supplier registroAntigo = ObterPorId(SupplierID);

                //Atualizando os dados
                registroAntigo.Categ_id = categoria;

                //Executo a transação
                Con.SaveChanges();
            }
            catch
            {
                throw;
            }
        }

        public bool VerificaAgregado(int IdCidade)
        {
            try
            {
                return Con.Suppliers.Any(c => c.CID_id == IdCidade);
            }
            catch
            {
                throw;
            }
        }

        public bool VerificaExiste(string nome, int IdCidade, int IdSupplier)
        {
            try
            {
                if (IdSupplier > 0)
                {
                    return Con.Suppliers.Where(s => s.S_nome.Equals(nome) && s.CID_id == IdCidade && s.S_id != IdSupplier).Count() != 0;
                }
                else
                {
                    return Con.Suppliers.Where(s => s.S_nome.Equals(nome) && s.CID_id == IdCidade).Count() != 0;
                }
            }
            catch
            {
                throw;
            }
        }

        public bool VerificaLodge(int IdSupplier)
        {
            try
            {
                return Con.Suppliers.Where(s => s.S_id == IdSupplier &&
                                                s.S_Categoria_Escrita.CategoriaEscrita_nome.Equals("Lodge")
                                                ||
                                                s.S_id == IdSupplier &&
                                                s.S_Categoria_Escrita.CategoriaEscrita_nome.Equals("Jungle Lodge")
                                                ||
                                                s.S_id == IdSupplier &&
                                                s.S_Categoria_Escrita.CategoriaEscrita_nome.Equals("Cruise")).Count() != 0;
            }
            catch 
            {                
                throw;
            }
        }

        public Supplier RetornaPorMServicoValores(int IdMServico, int IdBase)
        {
            try
            {

                return (from mov in Con.Monta_Servico_Valores
                        join mon in Con.Monta_Servico on mov.IdMServico equals mon.IdMServico
                        join sup in Con.Suppliers on mon.S_id equals sup.S_id
                        where mov.IdMServico == IdMServico &&
                              mov.Base_id == IdBase
                        select sup).Distinct().SingleOrDefault();

            }
            catch 
            {                
                throw;
            }
        }

    }
}
